#include "resource_manager/resource_manager.h"

#include <iostream>

#include "absl/base/attributes.h"

namespace sysinfo {
namespace monitor {

// 注意：构造函数和析构函数已经在头文件中默认定义，不要在这里重复定义

void ResourceManager::LoadConfig(const ConfigProto& config) {
    // 清空现有配置
    resource_configs_.clear();
    
    // 加载资源配置
    for (const auto& resource_config : config.resource_manager_configs()) {
        resource_configs_.emplace(resource_config.thread_name(), resource_config);
    }
}

bool ResourceManager::IsCpuOverloaded(const std::string& module_name, double cpu_usage) const {
    auto it = resource_configs_.find(module_name);
    if (it == resource_configs_.end()) {
        return false; // 未找到配置，默认不过载
    }
    
    const auto& cpu_config = it->second.cpu_config();
    return cpu_usage > cpu_config.kickout_deadline();
}

bool ResourceManager::IsMemoryOverloaded(const std::string& module_name, uint64_t memory_usage) const {
    auto it = resource_configs_.find(module_name);
    if (it == resource_configs_.end()) {
        return false; // 未找到配置，默认不过载
    }
    
    const auto& memory_config = it->second.memory_config();
    // 修复类型不匹配问题，将uint64_t转换为int64_t进行比较
    return static_cast<int64_t>(memory_usage) > memory_config.kickout_deadline();
}

std::pair<int64_t, int64_t> ResourceManager::GetCpuThresholds(const std::string& module_name) const {
    auto it = resource_configs_.find(module_name);
    if (it == resource_configs_.end()) {
        return {0, 0}; // 未找到配置，返回默认值
    }
    
    const auto& cpu_config = it->second.cpu_config();
    return {cpu_config.kickout_deadline(), cpu_config.terminate_deadline()};
}

std::pair<int64_t, int64_t> ResourceManager::GetMemoryThresholds(const std::string& module_name) const {
    auto it = resource_configs_.find(module_name);
    if (it == resource_configs_.end()) {
        return {0, 0}; // 未找到配置，返回默认值
    }
    
    const auto& memory_config = it->second.memory_config();
    return {memory_config.kickout_deadline(), memory_config.terminate_deadline()};
}

}  // namespace monitor
}  // namespace sysinfo